วิธีการใช้ S3 จาก EC2 และการใช้ AWS CLI S3
สวัสดีครับ วันนี้ผมจะมาอธิบายเกี่ยวกับ วิธีการใช้ S3 จาก EC2 และการใช้ AWS CLI S3 ครับ
เมื่อเราต้องทำการเข้าถึง S3 จาก AWS CLI ผมคิดว่าเราต้องใช้ AWS ACCESS KEY บ่อยมาก อย่างไรก็ตาม ถ้าหาก AWS ACCESS KEY ของเรารั่วไหลโดยไม่รู้ตัว ก็จะเกิดความเสี่ยงในการใช้งานเป็นอย่างมาก ดังนั้น ขอแนะนำให้คุณหลีกเลี่ยงการใช้ AWS ACCESS KEY ให้มากที่สุด ในบทความนี้ ผมจะสาธิตวิธีเข้าการถึง S3 จาก AWS CLI โดยไม่ต้องใช้ AWS ACCESS KEY จาก EC2 ครับ
เป้าหมายในการทำ
Service ที่ใช้ในบทความนี้คือ:
- Amazon S3
- Buckets
- AWS Identity and Access Management (IAM)
- Roles
- Amazon EC2
- Key Pairs
- Instance
- Security Groups
โปรแกรมที่ใช้ในบทความนี้คือ:
- PuTTY
การสร้าง Buckets ใน Amazon S3
การตั้งค่า General configuration:
» Bucket name: tinnakorn-test-s3
(ชื่ออะไรก็ได้)
» AWS Region: Asia Pacific (Singapore) ap-southeast-1
(ตรวจสอบและเลือกใช้รีเจี้ยนที่ใกล้กลับประเทศที่เราอาศัยอยู่ให้มากที่สุด)
เลื่อนลงมาด้านล่างสุด คลิกปุ่ม Create bucket
การสร้าง Role ใน IAM
เข้ามาที่ Service IAM โดยค้นหา ?︎IAM
» เลือกIAM
Step 1 - Select trusted entity:
Trusted entity type
» เลือกAWS service
Use case
» เลือก ◉ EC2
» คลิกNext
Step 2 - Add permissions:
» ค้นหา Permissions policies:AmazonS3FullAccess
» ติ๊ก✅
AmazonS3FullAccess
» คลิกNext
Step 3 - Name, review, and create:
» Name:tinnakorn-test-ec2-role
(ชื่ออะไรก็ได้)
เลื่อนลงมาด้านล่างสุด คลิกCreate role
การ Create Key Pair
ดูตัวอย่างที่นี่: การ Create Key Pair
รายละเอียดการ Create Key Pair ในบทความนี้คือ:
Name:tinnakorn-test
Private key file format:.ppk
การ Launch Instance
มาที่หัวข้อ Name and tags
» Name:tinnakorn-test
(ชื่ออะไรก็ได้)
ถัดมาหัวข้อ Application and OS Images (Amazon Machine Image) นี้คือ Instance จะมีเซิร์ฟเวอร์ให้เลือกใช้มากมาย เช่น macOS, Red Hat, SUSE Linux, Ubuntu, Microsoft Windows, Debian เป็นต้น ซึ่งในบทความนี้จะใช้ Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type ในการติดตั้ง
» เลือกAmazon Linux
» เลือกAmazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
ถัดมาหัวข้อ Instance type นี้คือ เราสามารถเลือก Type CPU Memory ที่จะนำไปใช้งานได้ตามความต้องการ ไม่ว่าเว็บไซต์จะมีขนาดเล็กหรือขนาดใหญ่ ก็สามารถเลือกขนาดความจุของ CPU Memory ได้ตามความเหมาะสม
ค้นหา?︎ t3a.nano
และเลือกt3a.nano
ก็จะได้สเปค Family:t3a | 2 vCPU | 0.5 GiB Memory
ตามนี้
ถัดมาหัวข้อ Key pair (login)
เลือกKey pair name - requiredที่สร้างไว้ก่อนหน้านี้ เช่นtinnakorn-test
ถัดมาหัวข้อ Network settings คลิกEdit
เลื่อนลงมาที่หัวข้อ Firewall (security groups)
เปลี่ยนชื่อ Security group name - required และ Description - required เช่นtinnakorn-test
ถัดมาหัวข้อ Inbound security groups rules นี้คือ การตั้งค่า My IP เพื่อจำกัดการเชื่อมต่อ SSH จากทุกตำแหน่ง ซึ่งในส่วนนี้จะทำให้สามารถเชื่อมต่อ SSH จาก My IP (ที่อยู่ IP ปัจจุบันของคุณ) ได้เท่านั้น และในกรณีที่ใช้ HTTP จะเป็นการแสดงผลหน้าเว็บไซต์นั่นเอง
» เปลี่ยน Source type ของ ssh ให้เป็น Source type:My IP
ถัดมาหัวข้อ Configure storage นี้คือ เราสามารถเพิ่ม Storage ในส่วนของ Size (GiB) ได้ โดยค่าเริ่มต้นจะเป็น 8 GB
ในตัวอย่างนี้จะใช้เป็นค่าเริ่มต้น ก็จะไม่ทำการตั้งค่าใดๆ
ถัดมาหัวข้อ Advanced details
» คลิกที่Advanced details
แล้วหน้าต่างจะขยายลงมา
» เลือก IAM instance profile ที่สร้างไว้ก่อนหน้านี้ เช่นtinnakorn-test-ec2-role
มาที่หัวข้อ Summary ด้านขวาแล้วตรวจสอบรายละเอียด และคลิกLaunch instance
เมื่อสร้าง Instance เสร็จแล้ว Status Checks จะเป็น? Initializing
คือ Instance กำลังทำการสตาร์ทระบบขึ้นมา
ให้รอจนกว่า Status Checks เป็น✅ 2/2 checks passed
เพียงเท่านี้การเริ่มต้นระบบก็เสร็จสมบูรณ์แล้วครับ
การ Connect to EC2 by PuTTY
เมื่อสร้าง EC2 Instance เสร็จแล้ว ต่อไปจะทำการเชื่อมต่อ EC2 ด้วย PuTTY โดยดูขั้นตอนการทำที่ลิงก์ด้านล่างนี้เลยครับ
ทดสอบการใช้ S3 จาก EC2 และการใช้ AWS CLI S3
การ Upload ไฟล์ไปยัง S3 ผ่าน Console
- ตรวจสอบข้อมูล S3 ใน Server Amazon Linux 2
ก่อนที่จะทำการอัปโหลดไฟล์ เรามาตรวจสอบข้อมูลของ S3 ใน Amazon Linux 2 กันก่อนครับ
มาที่หน้า 「 Amazon S3 » Buckets 」 แล้วทำการ Copy Bucket เตรียมไว้
กลับมาที่หน้า PuTTY ที่ Login ไว้เมื่อสักครู่นี้
แล้วรันคำสั่งนี้เพื่อตรวจสอบข้อมูลใน S3 โดยมีการใช้งานคำสั่งaws s3 ls s3://
+bucket_name
aws s3 ls s3://tinnakorn-test-s3
Output ↓↓↓
เมื่อรันคำสั่งแล้วจะเห็นว่าไม่มีข้อมูลอะไรแสดงขึ้นมา
[root@ip-172-31-23-163 ~]# aws s3 ls s3://tinnakorn-test-s3 // คำสั่งที่รันไป
[root@ip-172-31-23-163 ~]#
ทีนี้ให้กลับไปที่หน้า「 Amazon S3 » Buckets 」 แล้วดูในส่วนของที่เก็บข้อมูล จะเห็นว่ายังไม่มีการ Upload ข้อมูล ก็เลยไม่แสดงใน PuTTY เมื่อสักครู่นี้นั่นเอง
- Upload ไฟล์ไปยัง S3 ผ่าน Console
ทีนี้ผมจะลอง Upload ไฟล์ลง S3 ดูครับ แล้วทำการเข้าไปตรวจสอบที่ Server Amazon Linux 2 อีกครั้ง
ผมจะทำการ Upload ไฟล์
test.txt
ไปยัง S3 ผ่าน Console AWS
ซึ่งการอัปโหลดไฟล์มีหลายวิธี สามารถดูตัวอย่างที่ลิงก์หรือรูปภาพด้านล่างนี้ได้เลยครับ
- ตรวจสอบข้อมูล S3 ใน Server Amazon Linux 2 อีกครั้ง
เมื่ออัปโหลดข้อมูลเสร็จแล้ว รันคำสั่งนี้เพื่อตรวจสอบข้อมูลใน S3
aws s3 ls s3://tinnakorn-test-s3
Output ↓↓↓
เมื่อรันคำสั่งแล้วจะเห็นว่ามีไฟล์test.txt
แสดงขึ้นมา
[root@ip-172-31-23-163 ~]# aws s3 ls s3://tinnakorn-test-s3 // คำสั่งที่รันไป
2022-06-09 09:22:40 11 test.txt // ไฟล์ที่ Upload ลง S3 เมื่อสักครู่นี้
[root@ip-172-31-23-163 ~]#
การสร้างไฟล์ใน root และ Upload ไปยัง S3 ผ่าน Amazon Linux 2
- การสร้างไฟล์ใน Amazon Linux 2 [/root]
ขั้นตอนนี้ผมจะลองสร้างไฟล์test2.txt
ใน Server Amazon Linux 2 [/root] แล้วทำการ Copy ไฟล์ไปที่ S3 ครับ
รันคำสั่งตามนี้เพื่อเข้าไปยังหน้าสร้างไฟล์test2.txt
โดยใช้vi
+ ชื่อไฟล์
vi test2.txt
[root@ip-172-31-23-163 ~]# vi test2.txt // คำสั่งที่รัน
Output ↓↓↓
เมื่อเข้ามาแล้วให้กดปุ่มi
ที่แป้นพิมพ์ ให้"test2.txt" [New]
เปลี่ยนเป็น--INSERT--
แล้วพิมพ์ข้อความที่ต้องการ เช่นtest file
test file // พิมพ์ข้อความที่ต้องการ
~
~
~
~
~
~
~
~
~
~
-- INSERT -- 1,10 All // กดปุ่ม i ที่แป้นพิมพ์
เมื่อพิมพ์ข้อความเรียบร้อยแล้ว กดปุ่มEsc
ให้--INSERT--
หายไป
จากนั้นพิมพ์:wq
หรือ:x
เพื่อทำการ Save
test file
~
~
~
~
~
~
~
~
~
~
:x // กดปุ่ม Esc และพิมพ์ :wq หรือ :x เพื่อ Save
- ตรวจสอบไฟล์
test2.txt
ที่เราสร้างเมื่อสักครู่นี้
รันคำสั่งตามนี้เพื่อดูข้อมูลในไฟล์test2.txt
(เปลี่ยนชื่อไฟล์ test2.txt ให้เป็นชื่อไฟล์ที่คุณสร้างขึ้นมา)
less test2.txt
[root@ip-172-31-23-163 ~]# less test2.txt // คำสั่งที่รัน
Output ↓↓↓
เมื่อเข้ามาหน้านี้แล้วจะเห็นว่ามีข้อความ "test file" ที่ผมได้พิมพ์ไปเมื่อสักครู่นี้แสดงขึ้นมา
จากนั้นออกจากหน้านี้โดยกดปุ่มq
test file // ข้อความที่พิมพ์ลงไปเมื่อสักครู่นี้
test2.txt (END)
- การ Upload ไฟล์ไปยัง S3 ผ่าน Amazon Linux 2
เมื่อสร้างไฟล์เสร็จเรียบร้อยแล้ว เรามาลอง Upload ไฟล์test2.txt
โดยการ Copy ไปยัง s3 กันครับ
รันคำสั่งนี้เพื่อ Copy ไฟล์test2.txt
ไปยัง s3
# คำสั่งของ AWS CLI S3 => "aws s3 cp" # ไฟล์ที่เราสร้างใน root => "test2.txt" # ที่เก็บข้อมูลปลายทางของ S3 => "s3://tinnakorn-test-s3" # ↓↓↓ aws s3 cp test2.txt s3://tinnakorn-test-s3
Output ↓↓↓
ถ้ารันคำสั่งถูกต้องจะไม่เกิด Error และแสดงหน้าจอแบบนี้
[root@ip-172-31-23-163 ~]# aws s3 cp test2.txt s3://tinnakorn-test-s3 // คำสั่งที่รันไป
upload: ./test2.txt to s3://tinnakorn-test-s3/test2.txt
[root@ip-172-31-23-163 ~]#
- ตรวจสอบไฟล์
test2.txt
ที่หน้า Console s3
เข้ามาที่หน้า 「 Amazon S3 » Buckets 」 Reload หน้า Console 1 ครั้ง
จะเห็นว่ามีไฟล์test2.txt
ถูกอัปโหลดเข้ามาแล้ว
การ Upload โฟลเดอร์ไปยัง S3 ผ่าน Amazon Linux 2
- Upload โฟลเดอร์และไฟล์ไปยัง S3
รันคำสั่งนี้เพื่อ Copy ไฟล์test2.txt
พร้อมกับสร้างโฟลเดอร์test_folder
ให้ไปอยู่ในโฟลเดอร์ที่เก็บข้อมูล S3
# คำสั่งของ AWS CLI S3 => "aws s3 cp" # ไฟล์ที่เราสร้างใน root => "test2.txt" # ที่เก็บข้อมูลปลายทางของ S3 => "s3://tinnakorn-test-s3" # ชื่อโฟลเดอร์ที่ต้องการสร้าง => "/test_folder" # ไฟล์ใหม่ที่ Copy จาก test2.txt => "/test3.txt" # ↓↓↓ aws s3 cp test2.txt s3://tinnakorn-test-s3/test_folder/test3.txt
Output ↓↓↓
ถ้ารันคำสั่งถูกต้องจะไม่เกิด Error และแสดงหน้าจอแบบนี้
[root@ip-172-31-23-163 ~]# aws s3 cp test2.txt s3://tinnakorn-test-s3/test_folder/test3.txt // คำสั่งที่รันไป
upload: ./test2.txt to s3://tinnakorn-test-s3/test_folder/test3.txt
[root@ip-172-31-23-163 ~]#
- ตรวจสอบโฟลเดอร์
test_folder/
ที่หน้า Console S3
เข้ามาที่หน้า 「 Amazon S3 » Buckets 」 Reload หน้า Console 1 ครั้ง
จะเห็นว่ามีโฟลเดอร์test_folder/
ถูกอัปโหลดเข้ามาแล้ว
เมื่อคลิกเข้ามาที่ test_folder/ ก็จะเจอไฟล์test3.txt
การดาวน์โหลดไฟล์จาก S3 มายัง Amazon Linux 2
การดาวน์โหลดไฟล์นี้ ผมจะทดสอบดาวน์โหลดไฟล์test.txt
ที่ได้ Upload ลง S3 ผ่าน Console AWS ในตอนแรก
กลับมาที่หน้า Objects ที่เป็นหน้าหลัก
จากนั้นติ๊ก✅
test.txt และคลิก❐ Copy S3 URI
กลับมาที่ PuTTY แล้วรันคำสั่งตามนี้เพื่อดาวน์โหลดไฟล์
# คำสั่งของ AWS CLI S3 => "aws s3 cp" # S3 URI ที่ Copy มาเมื่อสักครู่ => "s3://tinnakorn-test-s3/test.txt" # ที่เก็บข้อมูลปลายทางของ root => "./" # ↓↓↓ aws s3 cp s3://tinnakorn-test-s3/test.txt ./
Output ↓↓↓
ถ้ารันคำสั่งถูกต้องจะไม่เกิด Error และแสดงหน้าจอแบบนี้
[root@ip-172-31-23-163 ~]# aws s3 cp s3://tinnakorn-test-s3/test.txt ./ // คำสั่งที่รันไป
download: s3://tinnakorn-test-s3/test.txt to ./test.txt
[root@ip-172-31-23-163 ~]#
- ตรวจสอบไฟล์
test.txt
ที่ดาวน์โหลดมาจาก S3 ใน Amazon Linux 2
รันคำสั่งll
เพื่อตรวจสอบข้อมูล
Output ↓↓↓
จะเห็นว่ามีไฟล์test.txt
ที่ดาวน์โหลดมาเมื่อสักครู่นี้ปรากฏขึ้นมาแล้ว
[root@ip-172-31-23-163 ~]# ll // รันคำสั่งนี้เพื่อตรวจสอบข้อมูล
total 8
-rw-r--r-- 1 root root 10 Jun 9 10:46 test2.txt
-rw-r--r-- 1 root root 11 Jun 9 09:22 test.txt // ไฟล์ที่ดาวน์โหลดมาจาก S3 เมื่อสักครู่นี้
[root@ip-172-31-23-163 ~]#
ทีนี้มาลองเข้าไปดูข้อมูลข้างในtest.txt
กันบ้างครับ
รันคำสั่งตามนี้เพื่อดูข้อมูลในไฟล์test.txt
(เปลี่ยนชื่อไฟล์ test.txt ให้เป็นชื่อไฟล์ที่คุณดาวน์โหลดมา)
less test.txt
Output ↓↓↓
เมื่อเข้ามาหน้านี้แล้วจะเห็นว่ามีข้อความ "test file" ที่ผมได้พิมพ์ลงไปตอนอัปโหลดลง S3 ผ่าน Console
จากนั้นออกจากหน้านี้โดยกดปุ่มq
test file // ข้อความที่พิมพ์ลงไปตอนอัปโหลดลง S3 ผ่าน Console
test.txt (END)
การลบฟังก์ชันใน Service ต่างๆ ที่ได้สร้างขึ้น
การลบฟังก์ชันใน Service ต่างๆ ถ้าเราไม่รู้ลำดับของการลบฟังก์ชันก็จะทำให้เกิด Error ในขณะลบ หรือไม่สามารถลบได้นั่นเอง เช่น ถ้าทำการลบ Security Group ที่กำลังเชื่อมต่ออยู่กับ EC2 โดยที่ไม่ Terminate EC2 ก่อน ก็จะไม่สามารถลบ Security Group ได้ เป็นต้น ดังนั้นแนะนำให้ลบตามขั้นตอนที่ผมเรียงไว้ได้เลยครับ
การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2
เข้ามาที่ 「 Service EC2 」 แล้วทำการลบ
Terminate Instance (ต้องรอจนกว่า Instance state เป็นTerminated
จึงจะเสร็จสมบูรณ์)
ลบ Security Group (ต้องรอจนกว่า Instance state เป็นTerminated
จึงจะสามารถลบ Security Group ได้)
การลบ Buckets ใน Amazon S3
เข้ามาที่ 「 Service S3 » Buckets 」 แล้วทำการลบ
Empty Bucket (ต้องทำให้ Bucket เป็น Empty ก่อน จึงจะสามารถลบได้)
การลบ Role และ Policies ใน IAM
เข้ามาที่ 「 Service IAM » Roles 」 แล้วทำการลบ
เข้ามาที่ 「 Service IAM » Policies 」 แล้วทำการลบ
สรุป
การสาธิตนี้เป็นการใช้งาน S3 จาก EC2 และใช้ AWS CLI S3 ในการ Upload และ Download ข้อมูลเพื่อหลีกเลี่ยงการใช้ AWS ACCESS KEY จาก EC2
ซึ่งวิธีนี้ 「 ช่วยลดปัญหาในเรื่องการรั่วไหลของ AWS ACCESS KEY ที่จะทำให้เกิดความเสี่ยงในการใช้งาน 」 ได้เป็นอย่างดี นอกจากนี้ยังทำให้การใช้งานของเราปลอดภัยมากขึ้นอีกด้วย
บทความที่เกี่ยวข้อง
- Amazon S3 คืออะไร? การแนะนำฟังก์ชันล่าสุดของ AWS ในปี 2022
- 【Update】วิธีติดตั้ง Amazon Linux 2 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
- How To Static Website EP2: การเก็บข้อมูลเว็บไซต์ลงบน Amazon S3 เพื่อให้ไปแสดงผลผ่าน Amazon CloudFront
- การอัปโหลดข้อมูลไปยัง Amazon S3 ด้วย CloudBerry Explorer
- การลบไฟล์อัตโนมัติด้วย S3
- เชื่อมต่อ Amazon S3 ด้วย WinSCP
- [ข้อควรระวัง] เกี่ยวกับการที่ Access Key หลุด(รั่วไหล) และถูกนำไปใช้โดยไม่ได้รับอนุญาต